package pl.edu.pw.elka.tinyrepo.gate.server;


import java.io.File;
import java.io.Serializable;

import com.thoughtworks.xstream.XStream;

import pl.edu.pw.elka.tinyrepo.common.DAVServer;
import pl.edu.pw.elka.tinyrepo.dataserver.server.DataServerFacade;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.DataServerDescriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.FileDescriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.RepoDescriptor;

public class GateServer extends DAVServer implements Serializable {
   /** */
   private static final long serialVersionUID = -3908634342813710258L;
   /** Deskryptor repozytorium.*/
   private RepoDescriptor descriptor;
   private String repoFile;
   /**
    * Konstruktor tworzacy serwer bramy.
    * @param port
    */
   public GateServer(Integer port, RepoDescriptor descriptor, String repoFile) {
	   
      super(port);
      this.descriptor = descriptor;
      this.repoFile = repoFile;
      addHandler("GET", new GETRequestHandler(descriptor));
      addHandler("PUT", new PUTRequestHandler(descriptor));
      addHandler("DELETE", new DELETERequestHandler(descriptor));
      addHandler("PROPFIND", new PROPFINDRequestHandler(descriptor));
      addHandler("MKCOL", new MKCOLRequestHandler(descriptor));
      addHandler("MOVE", new MOVERequestHandler(descriptor));
      addHandler("COPY", new COPYRequestHandler(descriptor));
      
   }
   
   /**
    * Dodaje nowy Data Serwer do informacji przechowywanych przez brame.
    * Dodanie Data Serwera powoduje jedynie dodanie jego deskryptora 
    * (nazwa+rozmiar+stub) do kolejki priorytetowej. Nie powoduje to zadnego
    * 
    * @param hostName
    * @param ds
    */
   void addDataServer(String hostName, DataServerFacade ds) {
      descriptor.addDataServerDescriptor(new DataServerDescriptor(hostName, ds));
      System.out.println("Registered DS: "+hostName);
   }
   
   /**
    * Metoda udostepniona DSom do informowania o nowym pliku.
    * 
    * @param path
    * @param id
    * @param hostName
    * @return
    */
   public boolean putFile(String path, Integer id, Long size, String hostName) { // FIXME pelne zaufanie do serwerow danych
      FileDescriptor desc = new FileDescriptor(id, hostName, size);
      try {
         descriptor.addFileOrDirectoryDesc(desc, path); 
         return true; // udalo sie usunac element
      }catch (Exception e) {
         System.err.println("When DS tried to put file to Gate: "+e);
         return false; // nie udalo sie usunac elementu
      }
   }
   
   /**
    * Metoda udostepniona DSm do informowania o usuwanym pliku.
    * 
    * @param path
    * @return
    */
   public boolean removeFile(String path) { // FIXME zaklada sie optymistycznie, ze serwery danych nie beda sobie 
                                  // na wzajem robic psikusow, usuwajac pliki ktore nie istnieja
                                  // FIXME  pelne zaufanie do serwerow danych
      try {
         descriptor.removeFileOrDirectoryDesc(path);
         return true; // udalo sie usunac element
      } catch (Exception e) {
         System.err.println("When DS tried to remove file from Gate: "+e);
         return false; // nie udalo sie usunac elementu
      }
   }
   
   
}
